package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.adisi.objetos.Documento;
import com.adisi.objetos.TipoDocumento;
import com.adisi.objetos.Dueno;
import com.sun.org.apache.xpath.internal.compiler.OpCodes;

public class DuenoDatos {

	public List<Dueno> conseguirTodosLosDuenos() {
		List<Dueno> duenos = new ArrayList<Dueno>();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Dueno_Select(?,?)}");
			
			sp.setNull("id_dueno", java.sql.Types.INTEGER);
			sp.setNull("id_usuario", java.sql.Types.INTEGER);
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			
			while (rs.next()) {
				Documento doc = new Documento(TipoDocumento.fromInt(rs.getInt("id_tipo_documento")), rs.getString("numero_documento"));
				
				Dueno dueno = new Dueno(
						rs.getInt("id_dueno"), 
						rs.getString("nombre"), 
						rs.getString("apellido"),
						doc,
						rs.getString("correo")
						);

				duenos.add(dueno);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return duenos;

	}

	public int guardarDueno(Dueno dueno) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		int ok = 0;
		
		try {
			
			con = coneccion.conectar();
			
			if(dueno.getIdDueno()!=0){
				
				
				sp = con.prepareCall("{call sp_Dueno_Update(?,?,?,?,?,?)}");
				
				sp.setInt("id_dueno", dueno.getIdDueno());
				sp.setString("nombre", dueno.getNombre());
				sp.setString("apellido", dueno.getApellido());
				sp.setInt("id_tipo_documento", dueno.getDocumento().getTipo().ordinal());
				sp.setString("numero_documento", dueno.getDocumento().getNumero());
				sp.setString("correo", dueno.getCorreo());
				
				sp.execute();
				
				ok = dueno.getIdDueno();
			} else {
				
				sp = con.prepareCall("{? = call sp_Dueno_Insert(?,?,?,?,?)}");
				
				sp.registerOutParameter(1, java.sql.Types.INTEGER);
				
				sp.setString("nombre", dueno.getNombre());
				sp.setString("apellido", dueno.getApellido());
				if(dueno.getDocumento()!=null){
					sp.setInt("id_tipo_documento", dueno.getDocumento().getTipo().ordinal());
					sp.setString("numero_documento", dueno.getDocumento().getNumero());
				} else {
					sp.setNull("id_tipo_documento", java.sql.Types.INTEGER);
					sp.setNull("numero_documento", java.sql.Types.VARCHAR);
				}
				sp.setString("correo", dueno.getCorreo());
	
				
				sp.execute();
				
				dueno.setIdDueno(sp.getInt(1));
				
				ok = sp.getInt(1);
				
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}

	public Dueno conseguirUnDueno(int duenoId) throws Exception {
		Dueno dueno = null;
		
		dueno = conseguirUnDueno(duenoId,  false);
		
		return dueno;
	}
	
	public Dueno conseguirUnDueno(int duenoId,  boolean esIdUsuario) throws Exception {
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		Dueno dueno = null;
		
		try {
			con = coneccion.conectar();
			
			
			sp = con.prepareCall("{call sp_Dueno_Select(?,?)}");
			
			if(esIdUsuario) {
				sp.setInt("id_usuario", duenoId);
				sp.setNull("id_dueno", java.sql.Types.INTEGER);
				
			} else {
				sp.setInt("id_dueno", duenoId);
				sp.setNull("id_usuario", java.sql.Types.INTEGER);
			}
			
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			
			while (rs.next()) {
				Documento doc = new Documento(TipoDocumento.fromInt(rs.getInt("id_tipo_documento")), rs.getString("numero_documento"));
				
				dueno = new Dueno(
						rs.getInt("id_dueno"), 
						rs.getString("nombre"), 
						rs.getString("apellido"),
						doc,
						rs.getString("correo")
						);
			}
		} catch (Exception e) {
			throw e;
		} 
		finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				throw e;
			}
		}

		return dueno;
		
	}

	
}
